import * as os from 'os';

import User from "./user";
import * as utils from './utils';

export default class DevstarAPIHandler {

  private devstarDomain: string;

  constructor() {
    // 获取domain
    const devstarDomainFromUserConfig = utils.devstarDomain()
    if (undefined == devstarDomainFromUserConfig || "" == devstarDomainFromUserConfig) {
      this.devstarDomain = "https://devstar.cn";
    } else {
      this.devstarDomain = devstarDomainFromUserConfig.endsWith('/') ? devstarDomainFromUserConfig.slice(0, -1) : devstarDomainFromUserConfig;
    }
  }

  public async verifyToken(token: string, username: string): Promise<boolean> {
    try {
        const response = await fetch(this.devstarDomain + `/api/devcontainer/user`, {
          method: 'GET',
          headers: {
            'Content-Type': 'application/json',
            'Authorization': 'token ' + token
          }
        });
      
        // 处理非200响应状态码
        if (!response.ok) {
          const text = await response.text(); // 先读取文本防止json解析失败
          if (response.status == 401) {
            throw new Error('Token错误')
          } else {
            throw new Error(`HTTP Error: ${response.status} - ${text}`);
          }
        }

        const responseData = await response.json();
        const data = responseData.data 
        if (data.username == undefined || data.username == "") {
          throw new Error('Token对应用户不存在')
        } else {
          // 验证用户名匹配
          if (data.username !== username) {
            throw new Error('Token与用户名不符');
          }
        }
      
        return true;
      } catch (error) {
        console.error(error)
        return false
      }
  }

  // 上传公钥
  public async uploadUserPublicKey(user: User): Promise<string> {
    return new Promise(async (resolve) => {
      // 获取机器名称
      const machineName = os.hostname();
      // 组成公钥名称
      const timestamp = Date.now();
      const keyTitle = `${user.getUsernameFromLocal()}-${machineName}-${timestamp}`
      const postData = {
        "key": user.getUserPublicKey(),
        "title": keyTitle
      }

      const uploadUrl = this.devstarDomain + `/api/v1/user/keys`

      // 上传公钥
      fetch(uploadUrl, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'token ' + user.getUserTokenFromLocal()
        },
        body: JSON.stringify(postData)
      })
        .then(response => {
          response.json().then(data => {
            if (response.ok) {
              console.log("Successfully upload new created public key.\n", data)
              resolve("ok")
            } else {
              throw new Error(`Failed to upload new created public key!\nError: ${data.message}`)
            }
          })
        })
        .catch(error => {
          console.error(error);
        });

    })
  }
}

